#pragma once
#include "../common/Log.hpp"
#include "../common/util.hpp"
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>

using namespace LogModule_ns;
using namespace util_ns;

class Compile
{
public:
    static bool compile(const std::string &file)
    {
        DLOG(DEBUG) << "进入编译模块";
        pid_t pid = fork();
        if (pid < 0)
        {
            DLOG(ERROR) << "创建子进程失败！";
            return false;
        }
        else if (pid == 0) // 子进程
        {
            umask(0);
            // 没有就创造，只写模式打开
            int err = open(util_ns::PathUtil::CompilerError(file).c_str(), O_CREAT | O_WRONLY, 0666);
            if (err == -1)
            {
                DLOG(WARNING) << "打开err流文件出错！";
                exit(1);
            }
            dup2(err, 2); // 重定向到stderr
            execlp("g++", "g++", "-o", util_ns::PathUtil::Exe(file).c_str(), util_ns::PathUtil::Src(file).c_str(), "-D", "COMPILER_ONLINE", "-std=c++17", nullptr);

            DLOG(ERROR) << "执行g++错误！";
            exit(2);
        }
        else
        {
            waitpid(pid, nullptr, 0);
            if (std::filesystem::exists(PathUtil::Exe(file)))
            {
                DLOG(INFO) << PathUtil::Src(file) << "文件编译成功！";
                return true;
            }
            else
            {
                DLOG(ERROR) << "编译失败！";
                return false;
            }
        }
    }
};
